#include "common.h"

void init_usart1_pin(void)
{
    GPIO_InitTypeDef gpio_init;
    gpio_init.Mode  = GPIO_MODE_AF_PP;
    gpio_init.Pin   = GPIO_PIN_9;
    gpio_init.Pull  = GPIO_PULLUP;
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &gpio_init);

    gpio_init.Mode  = GPIO_MODE_INPUT;
    gpio_init.Pin   = GPIO_PIN_10;
    gpio_init.Pull  = GPIO_NOPULL;
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &gpio_init);

    gpio_init.Mode  = GPIO_MODE_OUTPUT_PP;
    gpio_init.Pin   = GPIO_PIN_8 | GPIO_PIN_9;
    gpio_init.Pull  = GPIO_PULLDOWN;
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOC, &gpio_init);

    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);  // 使能接收
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);  // 使能接收
}
/**
 * @brief
 *
 * @param pclk2 MHz
 * @param bound
 */
void initUsart1(uint32_t pclk2, uint32_t bound)
{
    float    temp;
    uint16_t mantissa;
    uint16_t fraction;
    temp     = (float)(pclk2 * 1000000) / (bound * 16);
    mantissa = temp;
    fraction = (temp - mantissa) * 16;
    mantissa <<= 4;
    mantissa += fraction;
    init_usart1_pin();
    RCC->APB2ENR |= (1 << 14);
    USART1->CR1 |= (1 << 13);
    USART1->CR1 |= (1 << 5);
    USART1->BRR = mantissa;
    USART1->CR1 |= (1 << 2) | (1 << 3);

    NVIC_EnableIRQ(USART1_IRQn);

    while (!(USART1->SR & (1 << 6)))
        ;
}

void init_usart1(void)
{
    init_usart1_pin();
    RCC->APB2ENR |= (1 << 14);
    USART1->CR1 |= (1 << 13);
    USART1->CR1 |= (1 << 5);
    USART1->BRR = 0x271;
    USART1->CR1 |= (1 << 2) | (1 << 3);

    NVIC_EnableIRQ(USART1_IRQn);
}
